home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1993 / 6 / 02 / boopsi / boopsi.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  6.1 KB  |  202 lines

  1. /*
  2.  * Programm: Boopsi.c
  3.  * Autor:    Rainer Zeitler
  4.  * Es demonstriert die Kommunikations-
  5.  * möglichkeiten zwischen zwei BOOPSI-Objekten,
  6.  * ohne daß unser Programm die Steuerung übernehmen
  7.  * muß. Dennoch erhält unser Programm eine
  8.  * Mitteilung, sofern eines der Gadgets
  9.  * modifiziert wurde. Das Programm muß vom CLI/Shell
  10.  * gestartet werden.
  11.  * Compiler: SAS-C
  12.  * Aufruf:   lc -L boopsi.c
  13.  */
  14.  
  15. #include <exec/types.h>
  16. #include <utility/tagitem.h>
  17. #include <intuition/intuition.h>
  18. #include <intuition/gadgetclass.h>
  19. #include <intuition/icclass.h>
  20. #include <intuition/classusr.h>
  21. #include <clib/exec_protos.h>
  22. #include <clib/intuition_protos.h>
  23.  
  24. #include <stdio.h>
  25.  
  26. struct Library *IntuitionBase;
  27. struct Window  *MyWindow;
  28. struct IntuiMessage *IMsg;
  29. struct Gadget *Prop, *Integer;
  30.  
  31. Object *model,*int2prop,*prop2int;
  32.  
  33. ULONG DoMethod(Object *, ULONG, ... );
  34.  
  35. /*
  36.  * Teilt dem Prop-Gadget mit, sein Attribut
  37.  * PGA_Top in STRINGA_LongVal zu konvertieren
  38.  */
  39. struct TagItem Prop_To_Int[] =
  40. {
  41.   PGA_Top, STRINGA_LongVal,
  42.   TAG_END,0
  43. };
  44.  
  45. /*
  46.  * Teilt dem String-Gadget mit, sein Attribut
  47.  * STRINGA_LongVal in PGA_Top zu konvertieren
  48.  */
  49. struct TagItem Int_To_Prop[] =
  50. {
  51.   STRINGA_LongVal, PGA_Top,
  52.   TAG_END,0
  53. };
  54.  
  55. /* Parameter fürs Öffnen des Fensters */
  56. struct TagItem WindowTags[] =
  57. {
  58.   WA_Flags, WFLG_DEPTHGADGET | WFLG_DRAGBAR |
  59.             WFLG_CLOSEGADGET,
  60.   WA_IDCMP, IDCMP_CLOSEWINDOW | IDCMP_IDCMPUPDATE,
  61.   WA_Height, 200, WA_Width, 300,
  62.   WA_Title, (ULONG)"BOOPSI2-Test",
  63.   TAG_END,0
  64. };
  65.  
  66. void main(void)
  67. {
  68.   BOOL Fertig = FALSE; /* Für die Message-Schleife */
  69.  
  70.   /*
  71.    * Öffnen der Library (mind. V37, also OS 2.0 und
  72.    * höher
  73.    */
  74.   IntuitionBase = OpenLibrary("intuition.library", 37);
  75.  
  76.   if( IntuitionBase )
  77.   {
  78.     MyWindow = OpenWindowTagList(NULL,WindowTags);
  79.  
  80.     if( MyWindow )
  81.     {
  82.       /* Erzeugen eines propgclass-Objekts */
  83.       Prop=(struct Gadget *)NewObject(NULL,"propgclass",
  84.         GA_ID,     1, /* ID-Nummer des Gadgets */
  85.         GA_Width,  10, /* Gadget-Breite */
  86.         GA_Height, 80, /* Gadget-Höhe   */
  87.         GA_Top,    MyWindow->BorderTop+2,
  88.         GA_Left,   MyWindow->BorderLeft+2,
  89.         PGA_Total, 100, /* 100 mögliche Positionen */
  90.         PGA_Top,   10,  /* Startposition */
  91.         PGA_Visible, 10, /* Sichtbare Größe des
  92.                               Gadgetsknopfs */
  93.         PGA_NewLook, TRUE,
  94.         TAG_END);
  95.  
  96.       if( Prop )
  97.       {
  98.         /* Erzeugen eines Integer-String-Objekts */
  99.         Integer=(struct Gadget *) NewObject(NULL,"strgclass",
  100.           GA_ID,2,  /* ID-Nummer des Gadgets */
  101.           GA_Width,  100, /* Gadget-Breite */
  102.           GA_Height, 20,  /* Gadget-Höhe   */
  103.           GA_Top,  (MyWindow->BorderTop) + 5,
  104.           GA_Left, (MyWindow->BorderLeft) + 20,
  105.           /* Vorgänger dieses Gadgets */
  106.           GA_Previous, Prop,
  107.           STRINGA_LongVal,  10, /* Startwert */
  108.           STRINGA_MaxChars, 3,  /* Max. Zeichen */
  109.           TAG_END);
  110.  
  111.         if( Integer )
  112.         {
  113.           /* Einrichten des modelclass-Objekts */
  114.           model=(Object *)NewObject(NULL,
  115.                           "modelclass", TAG_DONE );
  116.           if( model )
  117.           {
  118.             /* Einrichten eines icclass-Objekts */
  119.             int2prop=(Object *)NewObject(NULL,
  120.                               "icclass", TAG_END );
  121.             if( int2prop )
  122.             {
  123.               prop2int=(Object *)NewObject(NULL,
  124.                               "icclass", TAG_END );
  125.               if( prop2int )
  126.               {
  127.                 /* Den Gadgets als Zielobjekt das
  128.                  * modelclass-Objekt angeben */
  129.                 SetGadgetAttrs(Prop, MyWindow, NULL,
  130.                        ICA_TARGET, model, TAG_DONE);
  131.                 SetGadgetAttrs(Integer, MyWindow,
  132.                   NULL,ICA_TARGET, model, TAG_DONE);
  133.  
  134.                 /* Dem modelclass-Objekt beide
  135.                  * icclass-Objekte in die Liste
  136.                  * zu benachrichtigender Objekte
  137.                  * anfügen */
  138.                 DoMethod(model,OM_ADDMEMBER,int2prop);
  139.                 DoMethod(model,OM_ADDMEMBER,prop2int);
  140.  
  141.                 /* Die Konvertierungsvorschriften und
  142.                  * das Zielobjekt beiden icclass-
  143.                  * Objekten angeben */
  144.                 SetAttrs(int2prop, ICA_TARGET, Prop,
  145.                       ICA_MAP, Int_To_Prop, TAG_DONE);
  146.  
  147.                 SetAttrs(prop2int, ICA_TARGET,Integer,
  148.                       ICA_MAP, Prop_To_Int, TAG_DONE);
  149.  
  150.                 /* Dem modelclass-Objekt als Ziel den
  151.                  * IDCMP-Port unseres Fensters
  152.                  * angeben */
  153.                 SetAttrs(model, ICA_TARGET,
  154.                             ICTARGET_IDCMP, TAG_DONE);
  155.  
  156.                 /* Gadgets ans Fenster anhängen und
  157.                  * anzeigen. */
  158.                 AddGList(MyWindow,Prop,-1,-1,NULL);
  159.                 RefreshGList(Prop,MyWindow,NULL,-1);
  160.  
  161.                 while (Fertig == FALSE)
  162.                 {
  163.                   /* Auf CLOSEWINDOW-Message warten*/
  164.                   WaitPort(MyWindow->UserPort);
  165.  
  166.                   while(IMsg=(struct IntuiMessage *)
  167.                      GetMsg(MyWindow->UserPort)) {
  168.                     switch( IMsg->Class )
  169.                     {
  170.                       case IDCMP_CLOSEWINDOW:
  171.                            Fertig = TRUE;
  172.                            break;
  173.                       case IDCMP_IDCMPUPDATE:
  174.                            printf("Nachricht von"
  175.                                   " Gadget\n");
  176.                            break;
  177.                     }
  178.                     ReplyMsg((struct Message *)IMsg);
  179.                   }
  180.                 }
  181.                 RemoveGList(MyWindow, Prop, -1);
  182.               }
  183.               else DisposeObject(int2prop);
  184.             }
  185.             /* Modelclass-Objekte löschen auch die
  186.              * via OM_ADDMEMBER angefügten Objekte.
  187.              * Die icclass-Objekte prop2int und
  188.              * int2prop müssen also nicht explizit
  189.              * selbst gelöscht werden. Dieser Aufruf
  190.              * reicht aus. */
  191.             DisposeObject(model);
  192.           }
  193.           DisposeObject(Integer);
  194.         }
  195.         DisposeObject(Prop);
  196.       }
  197.       CloseWindow(MyWindow);
  198.     }
  199.     CloseLibrary(IntuitionBase);
  200.   }
  201. }
  202.